package Codework;
import java.util.Scanner;
public class encryption {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请选择操作:(1.加密/2.解密)");
        int choice=sc.nextInt();
        switch(choice){
            case 1:
                System.out.println("请输入要加密的密码：");
                String password=sc.next();
                String encryption=encrypt(password);
                System.out.println("加密后的密码为："+encryption);
                break;
            case 2:
                System.out.println("请输入要解密的密码");
                String encrypted=sc.next();
                String decryption=decrypt(encrypted);
                System.out.println("解密后的密码为："+decryption);
                break;
            default:
                System.out.println("无效操作");
                break;
        }
    }
    //加密
    public static String encrypt(String password){
        char[] chars=password.toCharArray();
        int length=chars.length;
        StringBuilder stringBuilder=new StringBuilder();
        for (int i=0;i<length;i++){
            int ascii=(int)chars[i];
            ascii+=(i+1)+3;
            stringBuilder.append((char)ascii);
        }
        StringBuilder reversed = stringBuilder.reverse();
        char firstChar = reversed.charAt(0); //charAt()方法用于返回指定索引处的字符。索引范围为从0到 length()-1。
        char lastChar = reversed.charAt(length - 1);
        reversed.setCharAt(0, lastChar);
        reversed.setCharAt(length - 1, firstChar);
        //java.lang.StringBuilder.setCharAt() 方法的声明。
        //public void setCharAt(int index, char ch)    index是要修改的字符的索引，ch是新字符
        return reversed.toString();
    }
    //解密
    public static String decrypt(String encryptedPassword) {
        StringBuilder reversed = new StringBuilder(encryptedPassword).reverse();
        int length = reversed.length();
        char firstChar = reversed.charAt(length - 1);
        char lastChar = reversed.charAt(0);
        reversed.setCharAt(0, firstChar);
        reversed.setCharAt(length - 1, lastChar);


        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < length; i++) {
            int ascii = (int) reversed.charAt(i);
            ascii -= (i + 1) + 3;
            stringBuilder.append((char) ascii);
        }

        return stringBuilder.toString();
    }
}
/*
StringBuilder是Java提供的一个可变字符串类，它可以有效地进行字符串的拼接操作。在代码中，StringBuilder对象用于存储加密或解密后的密码字符。

在加密操作中，循环遍历原始密码字符数组并进行相应的加密操作后，将加密后的字符追加到StringBuilder对象中。

在解密操作中，同样循环遍历加密后的密码字符，进行相应的解密操作后，将解密后的字符追加到StringBuilder对象中。

最后，通过调用StringBuilder的toString()方法，将StringBuilder对象转换为一个字符串，从而得到最终的加密或解密结果。这就是return reversed.toString();的作用。

使用StringBuilder而不是普通的字符串拼接操作可以提高效率，因为StringBuilder是可变的，它不会每次拼接都创建一个新的字符串对象，而是在原有的基础上进行拼接操作，避免了频繁的内存分配和复制操作。这在处理大量字符时尤为重要。
 */
